[#ftl]
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
    <title>Hello World!</title>
</head>
<body>
[#include "header.ftl" ]
<p>

[#--
检测不存在的值： name?? 或者(user.name)??
name?? : name不为null或者存在
(bbb)!"0" : bbb不存在，默认0
<#if user.name??> <#if name??>
默认值被省略了，那么结果将会是空串，空序列或空哈希表。
--]
默认值省略:<br>
--(${mouse1!})
[#assign mouse1 = "Jerry"]
--(${mouse1!})
<br>

<h4>我的好友：</h4>
[#list friends as item]
    姓名：${item.name} , 年龄${item.age}
    <br>
[/#list]


${"Green " + "mouse"?upper_case} <#-- green MOUSE -->
${("Green " + "mouse")?upper_case} <#-- GREEN MOUSE -->
${("Green " + "mouse")?lower_case} <#-- green mouse -->

 ---substring 取子串<br>
    - ${'abc'?substring(0)}
    - ${'abc'?substring(1)}
    - ${'abc'?substring(2)}
    - ${'abc'?substring(3)}
    - ${'abc'?substring(0, 0)}
    - ${'abc'?substring(0, 1)}
    - ${'abc'?substring(0, 2)}
    - ${'abc'?substring(0, 3)}
    - ${'abc'?substring(0, 1)}
    - ${'abc'?substring(1, 2)}
    - ${'abc'?substring(2, 3)}

    ---cap_first 首字母大写<br>
${" green mouse"?cap_first}
${"GreEN mouse"?cap_first}
${"- green mouse"?cap_first}  [#--在"- green mouse"的情形下，第一个单词是-。--]
[#--
Green mouse
GreEN mouse
- green mouse
--]

    --uncap_first 首字母小写<br>
${" green mouse"?uncap_first}
${"GreEN mouse"?uncap_first}

--capitalize 所有单词首字母大写，其他小写<br>
${" green mouse"?capitalize}
${"GreEN mouse"?capitalize}
[#--
    Green Mouse
    Green Mouse
--]

    --chop_linebreak 切断换行符<br>

    -- date， time， datetime 日期，时间，时间日期<br>

    [#assign test1 = "10/25/1995"?date("MM/dd/yyyy")]
    [#assign test2 = "15:05:30"?time("HH:mm:ss")]
    [#assign test3 = "1995-10-25 03:05 PM"?datetime("yyyy-MM-dd hh:mm a")]
    ${test1}
    ${test2}
    ${test3}
    <br>

[#--将会打印出（基于当地（语言）和其他设置决定输出）
Oct 25, 1995
3:05:30 PM
Oct 25, 1995 3:05:00 PM
--]


    [#--如果你了解模板处理时默认的日期/时间/时间日期格式，你可以不用格式化参数：--]
    <#assign test1 = "Oct 25, 1995"?date>
    <#assign test2 = "3:05:30 PM"?time>
    <#assign test3 = "Oct 25, 1995 03:05:00 PM"?datetime>
    ${test1}
    ${test2}
    ${test3}

--date_format， time_format 和 datetime_format<br>
    ${dateVar?string.short}
    ${dateVar?string.medium}
    ${dateVar?string.long}
    ${dateVar?string.full}
    ${dateVar?string("yyyy-MM-dd HH:mm:ss zzzz")}

--ends_with 以…结尾：返回是否这个字符串以指定的子串结尾<br>
        ${"redhead"?ends_with("head")}
        ${"head"?ends_with("head")}

--html HTML 格式的转义文本<br>
[#--
 <用&lt 替换；
 >用&gt 替换；
 &用&amp 替换；
 "用&quot 替换；
注意如果你想安全地插入一个属性，你必须在 HTML 模板中使用引号标记（是"，而不
是'）为属性值加引号：
注意在 HTML 页面中，通常你想对所有插值使用这个内建函数。所以你可以使用
escape 指令来节约很多输入，减少偶然错误的机会。
--]

-- group 分组：只和内建函数 matches 的结果使用。

-- index_of 返回第一次字符串中出现子串时的索引位置<br>
        [#--
        如果第一个参数作为子串没有在该字符串中出现时（如果你使用了第二个参数，那么就从给定的序列开始。），那么就返回-1.
        --]

   ${"abcabc"?index_of("bc")} <br>
        [#--指定开始搜索的索引位置：--]
   ${"abcabc"?index_of("bc", 2)} <br>


-- j_string ：根据 Java 语言字符串转义规则来转义字符串<br>
    <#assign beanName = 'The "foo" bean.'>
     String BEAN_NAME = "${beanName?j_string}";
[#--
String BEAN_NAME = "The \"foo\" bean.";
--]


--js_string JavaScript 语言规则的字符串转义<br>

<#assign user = "Big Joe's \"right hand\"">
<script>
    alert("Welcome ${user?js_string}!");
</script>
[#--
<script>
    alert("Welcome Big Joe\'s \"right hand\"!");
</script>
--]

    -- json_string JSON 规则的字符串转义<br>
[#--
这不会转义'字符，因为 JSON 字符串必须使用"来括起来。它会在<之后直接出现的/斜杠）字符转义为\/，来避免</script>等。
它也会在]]之后转义>字符为\u003E，避免退出 XML 的 CDATA 段。
--]

    -- last_index_of 最后的索引所在位置<br>
    ${"abcabc"?last_index_of("ab")}  --3
    ${"abcabc"?last_index_of("ab", 2)} --0

    --length 字符串长度<br>
    ${"ababc"?length}

    --left_pad 距左边<br>
[#-- 2.3.1 版本开始可用。
仅仅用 1 个参数，那么它将在字符串的开始插入空白，直到整个串的长度达到参数指定的值。
如果字符串的长度达到指定数值或者比指定的长度还长，那么就什么都不做了
--]

    [${""?left_pad(5)}]
    [${"a"?left_pad(5)}]
    [${"ab"?left_pad(5)}]
    [${"abc"?left_pad(5)}]
    [${"abcd"?left_pad(5)}]
    [${"abcde"?left_pad(5)}]
    [${"abcdef"?left_pad(5)}]
    [${"abcdefg"?left_pad(5)}]
    [${"abcdefgh"?left_pad(5)}]

[#--
    [ ]
    [ a]
    [ ab]
    [ abc]
    [ abcd]
    [abcde]
    [abcdef]
    [abcdefg]
    [abcdefgh]
--]


 [#--

使用了两个参数，那么第一个参数表示的含义和你使用一个参数时的相同，第二个
参数指定用什么东西来代替空白字符。比如：
 --]

    [${""?left_pad(5, "-")}]
    [${"a"?left_pad(5, "-")}]
    [${"ab"?left_pad(5, "-")}]
    [${"abc"?left_pad(5, "-")}]
    [${"abcd"?left_pad(5, "-")}]
    [${"abcde"?left_pad(5, "-")}]


[#--
第二个参数也可以是个长度比 1 大的字符串。那么这个字符串会周期性的插入
--]
    将会打印：
    第二个参数必须是个字符串值，而且至少有一个字符。
    [${""?left_pad(8, ".oO")}]
    [${"a"?left_pad(8, ".oO")}]
    [${"ab"?left_pad(8, ".oO")}]
    [${"abc"?left_pad(8, ".oO")}]
    [${"abcd"?left_pad(8, ".oO")}]

  [#--
    [.oO.oO.o]
    [.oO.oO.a]
    [.oO.oOab]
    [.oO.oabc]
    [.oO.abcd]
--]

    --right_pad 距右边<br>
[#--2.3.1 版本开始可用--]

    [${""?right_pad(5)}]
    [${"a"?right_pad(5)}]
    [${"ab"?right_pad(5)}]
    [${"abc"?right_pad(5)}]
    [${"abcd"?right_pad(5)}]
    [${"abcde"?right_pad(5)}]
    [${"abcdef"?right_pad(5)}]
    [${"abcdefg"?right_pad(5)}]
    [${"abcdefgh"?right_pad(5)}]
    [${""?right_pad(8, ".oO")}]
    [${"a"?right_pad(8, ".oO")}]
    [${"ab"?right_pad(8, ".oO")}]
    [${"abc"?right_pad(8, ".oO")}]
    [${"abcd"?right_pad(8, ".oO")}]

 [#--
    [ ]
    [a ]
    [ab ]
    [abc ]
    [abcd ]
    [abcde]
    [abcdef]
    [abcdefg]
    [abcdefgh]
    [.oO.oO.o]
    [aoO.oO.o]
    [abO.oO.o]
    [abc.oO.o]
    [abcdoO.o]
 --]

    --contains 包含<br>
    [#--
    2.3.1 版本开始可用。
    --]
    [#if "piceous"?contains("ice")] It contains "ice" [/#if]

    [#--
    It contains "ice
    --]

--matches 匹配<br>
[#--
这个函数决定了字符串是否精确匹配上模式。而且，它返回匹配的子串列表。返回值是一个多类型的值：
--]


    [#if "fxo"?matches("f.?o")]Matches.[#else]Does not match.[/#if]

    [#assign res = "foo bar fyo"?matches("f.?o")]
    [#if res]Matches.[#else]Does not match.[/#if]

    Matching sub-strings:
    [#list res as m]
        - ${m}
    [/#list]



 [#include "footer.ftl" ]
 </body>
</html>